<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Symbol1</title>
</head>
<body>
    
</body>
</html>
<script>
    //symbol用于防止命名冲突产生的
    //symbol的值是唯一的，所以他们永远不会相等
    // let hd = Symbol();
    // let edu = Symbol();
    // console.log(typeof hd);
    // console.log(hd == edu)

    //Symbol不可以添加属性
    // let hd = Symbol();
    // hd.name = '后盾人';
    // console.log(hd.name)

    //描述参数
    // let hd = Symbol("is name");
    // let edu = Symbol("这是一个测试");

    // console.log(hd)
    // console.log(edu)
    // //得到symbol的描述值
    // console.log(edu.toString())

    
    //传入相同的参数Symbol也是独立唯一的，因为只是参数描述而已
    // let hd = Symbol("后盾人");
    // let edu = Symbol("后盾人");
    // console.log(hd == edu);

    //使用description  可以获取传入的参数
    // let hd = Symbol("后盾人");
    // console.log(hd.description);

    //使用symbol.for会在系统上进行登记，下次进来回去找 找不到会新建
    // let hd = Symbol.for("后盾人");
    // let edu = Symbol.for("后盾人");
    // console.log(hd == edu)

    //Symbol.keyFor  获取Symbol.for 登记的返回描述
    // let hd = Symbol.for("后盾人");
    // console.log(Symbol.keyFor(hd));

    // //没有在系统中登记  所以获取不到
    // let edu = Symbol("houdunren");
    // console.log(Symbol.keyFor(edu));


    //对象属性
    //下面的写法是错误的
    // let symbol1 = Symbol("操作人");
    // let obj = {
    //     symbol1:'hdcms'
    // };
    // console.log(obj.symbol1)

    //下面的写法是正确的
    // let symbol = Symbol("后盾人");
    // let obj = {
    //     [symbol] : "houdunren"
    // };
    // console.log(obj[symbol]);

    //为了使属性不重复  使用Symbol()来生成唯一的键
    //但是要记得   声明对象的时候和读取对象的时候必须使用 []的形式处理
    // let user1 = {
    //     name:'李四',
    //     key:Symbol()
    // };

    // let user2 = {
    //     name:'李四',
    //     key:Symbol()
    // };

    // let grade = {
    //     [user1.key] : {js:100,css:89},
    //     [user2.key] : {js:35,css:55}
    // };

    // //两个对象使用相同的名字
    // console.log(grade[user1.key].js);

    //实例操作
    //缓存操作
    //使用symbol  可以解决在保存数据的时候由于名称相同而造成的耦合覆盖问题
    //生命一个缓存类
    // class Cache{
    //     static data = {};
    //     //设置缓存
    //     static set(name,value){
    //         this.data[name] = value;
    //     }
    //     //读取缓存
    //     static get(name){
    //         return this.data[name];
    //     }
    // }

    // //使用symbol解决耦合覆盖的问题
    // let user = {
    //     name:'后盾人',
    //     key:Symbol("缓存")
    // };
    // let cart = {
    //     name:'购物车',
    //     key:Symbol('购物车')
    // };

    // //将人的资料和购物车的数据写入缓存

    // Cache.set(user.key,user);
    // Cache.set(cart.key,cart);
    // console.log(Cache.get(cart.key).name);
    // console.log(Cache.get(user.key))

    // console.log(Cache.data);


    //遍历属性
    //symbol 不能使用  for in    for of 遍历操作
    // let symbol = Symbol("后盾人");
    // let obj = {
    //     name:'hdcms.com',
    //     [symbol] : "houdurenn.com"
    // };

    //只能打印出name    symbol对象不能打印
    // for(const key in obj){
    //     console.log(key)
    // }


    // for(const key of Object.keys(obj)){
    //     console.log(key)
    // }

    //可以使用Object.getOwnPropertySymbols获取所有的Symbol对象
    // for(const key of Object.getOwnPropertySymbols(obj)){
    //     console.log(key)
    // }


    //获取所有的对象，包括symbol
    // for(const key of Reflect.ownKeys(obj)){
    //     console.log(key)
    // }


    //如果对象不想被遍历的话   可以使用symbol进行保护
    const site = Symbol('网站名称');
    class User{
        constructor(name){
            this[site] = '后盾人';
            this.name = name;
        }

        getName(){
            return `${this[site]} - ${this.name}`;
        }
    }

    const hd = new User("向军大叔");
    console.log(hd.getName());
    console.log(hd)
    for(const key in hd){
        console.log(key)
    }


    
    



                
</script>